三、Linux + GCC
3.1 目录结构

项目目录/
├── include/
│ ├── c_interface/ # C 接口头文件
│ ├── cpp_interface/ # C++ 接口主入口
│ └── parameter/ # 参数结构体头文件
├── lib/
│ └── libnrc_host.so # Linux 动态库
├── src/
│ └── main.cpp
└── Makefile3.2 Makefile
TARGET=demo
all:
g++ -o $(TARGET) src/*.cpp -I./include -L./lib -lnrc_host -lpthread -lm -ldl -lrt -lstdc++ -std=c++11 -fPIC
clean:
rm -f $(TARGET)编译器与动态库必须配套(常见踩坑)
SDK 的 Linux 动态库按编译器 ABI 提供两个版本,必须与编译所用编译器配套使用(用 g++ --version 确认版本后选择对应库):
| 编译器 | 动态库目录(SDK 包内) |
|---|---|
| g++-9(Ubuntu 20.04 等新系统) | cpp/linux/linux_gcc-9_x64_v2.0.4/ |
| g++-4.8(较老系统) | cpp/linux/linux_gcc-4_x64_v2.0.4/ |
混用(例如用 g++-4.8 链接 gcc-9 库)会在链接阶段报 undefined reference to connect_robot(std::string const&, std::string const&)——该错误只出现在含 std::string 的接口上,容易误判。 另外,编译请显式加 -std=c++11:较老的 g++(如 4.8)默认 C++98,<thread> / <chrono> 等标准库不可用。
3.3 运行时动态库路径
编译成功后运行前,需要让系统能找到 libnrc_host.so:
# 方式一:设置 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
./demo
# 方式二:将库复制到系统目录
sudo cp lib/libnrc_host.so /usr/local/lib/
sudo ldconfig
./demo3.4 头文件路径与最小连接代码
3.4.1 头文件包含路径
SDK 头文件之间存在两层 #include 关系,集成到自有工程时若目录结构与 3.1 节不同,需要同步调整这些路径,否则编译会报 No such file or directory。
第一层:nrc_api.h 包含同目录下的其他接口头文件
nrc_api.h 与下列头文件同位于 include/cpp_interface/ 目录,直接用文件名引用即可:
// include/cpp_interface/nrc_api.h
#include "nrc_craft_conveyor_belt_track.h"
#include "nrc_craft_vision.h"
#include "nrc_craft_weld.h"
#include "nrc_interface.h"
#include "nrc_io.h"
#include "nrc_job_operate.h"
#include "nrc_modbus.h"
#include "nrc_queue_operate.h"
#include "nrc_track.h"
#include "nrc_dual_arm.h"第二层:被包含的头文件再引用 parameter/ 目录下的参数头文件
由于 cpp_interface/ 与 parameter/ 是 include/ 下的平级目录,被包含的头文件使用 ../parameter/ 相对路径引用参数定义。以 nrc_craft_conveyor_belt_track.h 为例:
// include/cpp_interface/nrc_craft_conveyor_belt_track.h
#include "../parameter/nrc_define.h"
#include "../parameter/nrc_craft_conveyor_belt_track_parameter.h"若你的工程把
parameter/放到了其他位置(如cpp_interface/内部,或重命名了目录),需要同步修改这些#include路径。
3.4.2 最小连接代码
#include <iostream>
#include <unistd.h>
#include "../include/cpp_interface/nrc_api.h"
int main() {
std::cout << "正在连接控制器..." << std::endl;
SOCKETFD fd = connect_robot("192.168.1.15", "6001");
if (fd <= 0) {
std::cout << "连接失败" << std::endl;
return 1;
}
// 等待连接就绪
while (get_connection_status(fd) != 0) {
usleep(200000);
}
std::cout << "连接成功: " << fd << std::endl;
std::cout << "SDK 版本: " << get_library_version() << std::endl;
std::cout << "连接状态: " << get_connection_status(fd) << std::endl;
// 断开连接
disconnect_robot(fd);
return 0;
}3.5 编译运行
make
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
./demo输出 连接成功: 1 即表示配置正确。
下一步
完成连接测试后,请浏览接口示例了解更多 API 用法。